"""
应用工厂模式
"""
from flask import Flask
from flask_login import LoginManager
from config import config

# 导入模型
from app.models import db, login_manager
from app.extensions import csrf

# 导入蓝图
from app.routes import auth_bp, main_bp, project_bp, customer_bp, lead_bp, work_hour_bp, user_bp, task_bp, message_bp, followup_bp

# 导入定时任务
from app.utils.scheduler import init_scheduler

def create_app(config_name='development'):
    """
    创建应用实例
    :param config_name: 配置名称，默认为'development'
    :return: Flask应用实例
    """
    app = Flask(__name__)
    
    # 加载配置
    app.config.from_object(config[config_name])
    
    # 初始化扩展
    db.init_app(app)
    login_manager.init_app(app)
    csrf.init_app(app)
    
    # 设置登录视图
    login_manager.login_view = 'auth.login'
    login_manager.login_message = '请先登录以访问此页面'
    
    # 注册蓝图
    register_blueprints(app)
    
    # 注册错误处理器
    register_error_handlers(app)
    
    # 注册上下文处理器
    register_context_processors(app)
    
    # 初始化定时任务
    init_scheduler(app)
    
    # 创建数据库表（仅用于开发环境）
    if config_name == 'development':
        with app.app_context():
            db.create_all()
            # 创建默认消息模板
            from app.services.message_service import MessageService
            MessageService.create_default_templates()
    
    return app

def register_blueprints(app):
    """注册蓝图"""
    # 主页蓝图
    app.register_blueprint(main_bp)
    
    # 认证蓝图
    app.register_blueprint(auth_bp)
    
    # 项目蓝图
    app.register_blueprint(project_bp)
    
    # 客户蓝图
    app.register_blueprint(customer_bp)
    
    # 线索蓝图
    app.register_blueprint(lead_bp)
    
    # 工时蓝图
    app.register_blueprint(work_hour_bp)
    
    # 用户蓝图
    app.register_blueprint(user_bp)
    
    # 任务蓝图
    app.register_blueprint(task_bp)
    
    # 消息蓝图
    app.register_blueprint(message_bp)
    
    # 客户跟进蓝图
    app.register_blueprint(followup_bp)

def register_error_handlers(app):
    """注册错误处理器"""
    
    @app.errorhandler(404)
    def not_found_error(error):
        return '页面未找到', 404
    
    @app.errorhandler(500)
    def internal_error(error):
        db.session.rollback()
        return '服务器内部错误', 500

def register_context_processors(app):
    """注册上下文处理器"""
    
    @app.context_processor
    def inject_user():
        """注入当前用户到模板上下文"""
        from flask_login import current_user
        return dict(current_user=current_user)
    
    @app.context_processor
    def inject_utility_functions():
        """注入实用函数到模板上下文"""
        return dict(min=min, max=max)
    
    # 导入并注册模板过滤器
    from app.utils.helpers import format_date, format_currency, calculate_percentage, format_time, nl2br
    app.jinja_env.filters['format_date'] = format_date
    app.jinja_env.filters['format_currency'] = format_currency
    app.jinja_env.filters['calculate_percentage'] = calculate_percentage
    app.jinja_env.filters['format_time'] = format_time
    app.jinja_env.filters['nl2br'] = nl2br